#pragma once
#include "osg/NodeCallback"
#include "osg/Group"
#include <map>

/**
 * @brief The CThreadSafeUpdateCallback class 线程安全结点回调
 */

class CThreadSafeUpdateCallback : public osg::NodeCallback
{
public:
	CThreadSafeUpdateCallback(void);
	~CThreadSafeUpdateCallback(void);

public:
    /**
     * @brief operator 节点回调
     * @param node
     * @param nv
     */
	virtual void operator()(osg::Node* node, osg::NodeVisitor* nv);

public:
    /**
     * @brief AddChild 增加子节点
     * @param parent 父节点
     * @param node 子节点
     */
	bool AddChild(osg::Node* parent, osg::Node* node);

    /**
     * @brief RemoveChild 移除子节点
     * @param parent 父节点
     * @param node 子节点
     */
	bool RemoveChild(osg::Node* parent, osg::Node* node);

protected:
    /**
     * @brief hasThreadSafeUpdateCallback 判断是否是线程安全的回调
     * @param pCallback 回调
     */
	bool hasThreadSafeUpdateCallback(osg::Callback* pCallback);

protected:
	typedef std::map<long, osg::ref_ptr<osg::Group>> MAP_NODE;

    /**
     * @brief m_mapAddChilds 增加了子结点容器
     */
	MAP_NODE m_mapAddChilds;

    /**
     * @brief m_mapRemoveChilds 移除了子结点容器
     */
	MAP_NODE m_mapRemoveChilds;

    /**
     * @brief _addMutex 增加结点时候的锁
     */
    OpenThreads::Mutex _addMutex;

    /**
     * @brief _removeMutex 移除结点时候的锁
     */
    OpenThreads::Mutex _removeMutex;
};

